#pragma once
#include <string>
#include <vector>
#include <map>
#include <set>
class KeyRecommander
{
public:
    KeyRecommander();
    void doQuery(const std::string &keyword, std::vector<std::string> &suggestions);

private:
    // 编辑距离算法
    int editDistance(const std::string &word1, const std::string &word2);

    // 词典加载
    void loadDictAndIndex();
    void loadChineseDict();
    void loadEnglishDict();
    // !!! 新增的索引库加载方法声明 !!!
    void loadChineseIndex();
    void loadEnglishIndex();
    int countSameCharacters(const std::string &word1, const std::string &word2, bool is_chinese);
    // 辅助函数
    bool isChineseKeyword(const std::string &word);
    int calculateMaxEditDistance(const std::string &keyword);
    void supplementWithHighFrequencyWords(const std::string &keyword,
                                          std::vector<std::string> &suggestions,
                                          const std::map<std::string, int> &dict);

    // 词典数据
    std::map<std::string, int> _chinese_dict; // 中文词典：词汇->词频
    std::map<std::string, int> _english_dict; // 英文词典：词汇->词频
                                              // 新增：索引库 - 字符到词ID的映射
                                              // 新增：索引库 - 字符到词ID的映射
    std::map<std::string, std::set<int>> _chinese_index;
    std::map<std::string, std::set<int>> _english_index;
    // 新增：词ID到词的映射
    std::map<int, std::string> _id_to_word_cn;
    std::map<int, std::string> _id_to_word_en;

    // 候选词结构
    struct Candidate
    {
        std::string word;
        int edit_dist;
        int frequency;
        bool operator<(const Candidate &other) const
        {
            if (edit_dist != other.edit_dist)
            {
                return edit_dist > other.edit_dist; // 编辑距离小的优先
            }
            if (frequency != other.frequency)
            {
                return frequency < other.frequency; // 词频高的优先
            }
            return word > other.word; // 字典序小的优先
        };
    };
};